<?php
///
namespace lxsphp;

/**
 * 文件加载器
 *
 * @version $Id: Load.php 192 2014-07-18 02:27:45Z linsir123 $
 * @package lxsphp
 */
class Load
{
	/**
	 * APP过程加载的文件数
	 *
	 * @var array
	 * @static
	 */
	static $LOADED = array(__FILE__);

	/**
	 * 命名空间根节点对应的根路径
	 *
	 * @var array
	 * @static
	 */
	static $NODE_LIST = array(
		'lxsphp' => CORE_DIR,
		'app' => APP_DIR
	);

	/**
	 * 用于提供管理注册加载的类
	 *
	 * @var array
	 * @static
	 */
	static $CLASS_LIST = array();

	/**
	 * 类自动加载
	 *  暂定只有“框架”和“应用”模块支持自动加载机制
	 *  其它第三方类库自行按需加载
	 *
	 * @param string $class 类名
	 *
	 * @static
	 */
	static function __auto($class)
	{
		///
		//echo "<pre>";
		//echo $class;
		//echo "</pre>";

		///
		$v = explode("\\", $class);
		if (! empty($v)
			&& count($v) > 1
			&& array_key_exists($v[0], self::$NODE_LIST)
		) {
			$key = array_shift($v);
			$fileName = sprintf("%s.php", implode('/', $v));
			$dir = self::$NODE_LIST[$key];
			self::file($fileName, $dir);
		}

		///
		elseif (array_key_exists($v[0], self::$CLASS_LIST)) {
			$fileName = self::$CLASS_LIST[$class];
			self::file($fileName, null);
		}
	}

	/**
	 * 加载文件
	 *
	 * @param string $fileName 文件名
	 * @param string $dir 文件所在的目录
	 * @param bool $throw 若文件不存在是否抛出异常
	 *
	 * @throws \Exception
	 * @return mixed 若文件不存在返回`false`;否则返回`require`信息
	 * @static
	 */
	static function file($fileName, $dir = CORE_DIR, $throw = true)
	{
		///
		$file = $dir . $fileName;
		if (in_array($file, self::$LOADED))
			return false;

		///
		self::$LOADED[] = $file;
		if (file_exists($file))
			return require($file);

		///
		if ($throw)
			App::$I->getHandler()->panic("[APP] 文件不存在({$file})");

		///
		return false;
	}

	/**
	 * 注册自动加载
	 *
	 * @param $class
	 * @param $file
	 *
	 * @static
	 */
	static function register($class, $file)
	{
		///
		self::$CLASS_LIST[$class] = $file;
	}
}
